#include <bits/stdc++.h>

using namespace std;

// 连续阶乘逆元的线性递推
// 实现组合公式C(n,m)的计算
// 最终结果 % 1000000007后返回
// 0 <= m <= n <= 1000

const int MOD = 1000000007;
const int LIMIT = 1000;
// 阶乘表
// fac[i]代表 i! 在 %MOD 意义下的余数
long fac[LIMIT + 1];
// 阶乘结果的逆元表
// inv[i]代表i! 在 %MOD 意义下的逆元(1 / i!)
long inv[LIMIT + 1];

long power(long x, int n)
{
    long ans = 1;
    while(n)
    {
        if(n & 1) ans = ans * x % MOD;
        x = x * x % MOD;
        n >>= 1;
    }
    return ans;
}

void build()
{
    fac[1] = 1;
    for(int i = 2; i <= LIMIT; ++i)
    {
        fac[i] = ((long)i * fac[i - 1]) % MOD;
    }
    // 单个阶乘的逆元
    // inv[0] = 1;
    // for(int i = 1; i <= LIMIT; ++i)
    // {
    //     inv[i] = power(fac[i], MOD - 2);
    // }
    // 利用线性递推优化
    inv[LIMIT] = power(fac[LIMIT], MOD - 2);
    for(int i = LIMIT - 1; i >= 0; --i)
    {
        inv[i] = ((long)(i + 1) * inv[i + 1]) % MOD;
    }
}

// 组合公式
// 得到的结果 % MOD
// 阶乘结果逆元表的线性递推
int c(int n, int m)
{
    long ans = fac[n];
    ans = (ans * inv[m]) % MOD;
    ans = (ans * inv[n - m]) % MOD;
    return ans;
}

int main()
{
    build();
    int n = 500;
    for(int m = 0; m <= n; ++m)
    {
        cout << c(n, m) << endl;
    }

    // 要保证 b <= a <= LIMIT
    int a = 537;
    int b = 367;
    cout << "计算 C ( " << a << " , " << b << " ) % " << MOD << endl;
    cout << "答案为 : " << c(a, b) << endl;

    return 0;
}